package com.qfedu.edu.seckill.finishorderservice.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.qfedu.edu.seckill.bo.OrderShow;
import com.qfedu.edu.seckill.bo.QueueMessage;
import com.qfedu.edu.seckill.finishorderservice.mapper.OrderDetailMapper;
import com.qfedu.edu.seckill.finishorderservice.mapper.OrderMapper;
import com.qfedu.edu.seckill.finishorderservice.service.OrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qfedu.edu.seckill.po.Order;
import com.qfedu.edu.seckill.po.OrderDetail;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xiaobobo
 * @since 2025-02-06
 */
@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {


    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private OrderDetailMapper orderDetailMapper;


    /**
     * 下面的业务中的表在同一个库中(这里需要注意一个问题(目前是没有分库分表的情况
     * 在后续的业务中 可能涉及到分库分表的话 那么还是要跨库操作 所以这里也需要使用分布式事务))
     * @param queueMsgJson
     */
    @Override
    public void finishOrder(String queueMsgJson) {
         //将上面的string类型的数据 弄成 对象
        QueueMessage queueMessage = JSON.parseObject(queueMsgJson, QueueMessage.class);
        //接下来就知道这个type是啥了
        Integer type = queueMessage.getType();
        if(type==1){
            //说明是下订单
            //首先去Redis中查看这个消息的消费状态 如果已经是成功的 那么直接返回就可以了....
            finishOrderToDB(queueMessage);
            //记录消息的状态到Redis中去
            // String类型:  queue:message:consumer:status 0(成功)/1(失败)
        }else{
            //说明是修改订单状态
            updateOrderStatus(queueMessage);
        }

    }

    /**
     * 修改订单状态
     * @param queueMessage
     */
    private void updateOrderStatus(QueueMessage queueMessage) {
        //首先取出这个订单号
        String message = queueMessage.getMessage();
        OrderShow orderShow = JSON.parseObject(message, OrderShow.class);
        String orderNum = orderShow.getOrderNum();
        //接下来修改这个状态
        Integer status = orderShow.getStatus();
        //要先查询
        QueryWrapper<Order> orderQueryWrapper = new QueryWrapper<>();
        orderQueryWrapper.eq("order_num",orderNum);
        Order order = orderMapper.selectOne(orderQueryWrapper);
        order.setStatus(status);
        //进行更新
        orderMapper.updateById(order);
    }


    /**
     * 将订单放到数据库中去
     * @param queueMessage
     */
    public void finishOrderToDB(QueueMessage queueMessage) {
        //需要把queueMessage中的数据 封装成order对象
        String messageJson = queueMessage.getMessage();

        //说明是下订单
        OrderShow order = JSON.parseObject(messageJson, OrderShow.class);
        order.setPaymentType(0);
        order.setPostFee(0L);
        //接下来就可以下订单了...
        orderMapper.insert(order);


        //接下来还需要向订单详情表写入数据
        OrderDetail orderDetail = new OrderDetail();
        orderDetail.setOrderId(order.getOrderId());
        orderDetail.setImage(order.getPhoto());
        orderDetail.setNum(1);
        orderDetail.setClassId(order.getClassId());
        orderDetail.setPrice(order.getActualFee().intValue());
        orderDetail.setTitle(order.getClassName());

        //接下来再将这个数据放到数据库中
        orderDetailMapper.insert(orderDetail);
        log.info("订单号:{}下订单完成",order.getOrderNum());
    }

}
